﻿Imports System.Data
Imports MyGeneration.dOOdads
Imports ClassSigeco.ClassSigeco

Public Class controller_compras

    'Dim controllerVtas As New ControllerSigeco.controller_ventas
    'ultima 05:41 10/06/2014
    Private _MessageError As Exception = Nothing
    Public Property MessageError() As Exception
        Get
            Return _MessageError
        End Get
        Set(ByVal value As Exception)
            _MessageError = value
        End Set
    End Property

#Region "Proveedores"

    Public Function Insert_Proveedores(ByVal conn As String, ByVal proveedor As String, ByVal direccion As String, ByVal telefono1 As String, ByVal telefono2 As String, _
                                    ByVal ruc As String, ByVal email As String, ByVal codUsuario As Integer) As Integer

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim pro As New ClassSigeco.ClassSigeco.si_proveedor(conn)

            pro.AddNew()
            pro.Proveedor = proveedor
            pro.Direccion = direccion
            pro.Telefono1 = telefono1
            pro.Telefono2 = telefono2
            pro.Email = email
            pro.Ruc = ruc
            pro.Habilitado = True
            pro.ActualizadoPor = codUsuario
            pro.ActualizadoFecha = DateTime.Now
            pro.Save()

            tx.CommitTransaction()

            Return pro.IdProveedor

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return 0
        End Try

    End Function

    Public Function Update_Proveedores(ByVal conn As String, ByVal idProveedor As Integer, ByVal proveedor As String, ByVal direccion As String, ByVal telefono1 As String, ByVal telefono2 As String, _
                                    ByVal ruc As String, ByVal email As String, ByVal codUsuario As Integer, ByVal habilitado As Boolean) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim pro As New ClassSigeco.ClassSigeco.si_proveedor(conn)
            pro.Where.IdProveedor.Value = idProveedor

            If pro.Query.Load Then

                pro.Proveedor = proveedor
                pro.Direccion = direccion
                pro.Telefono1 = telefono1
                pro.Telefono2 = telefono2
                pro.Email = email
                pro.Ruc = ruc
                pro.Habilitado = habilitado
                pro.ActualizadoPor = codUsuario
                pro.ActualizadoFecha = DateTime.Now
                pro.Save()

            End If

            tx.CommitTransaction()
            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function Delete_Proveedores(ByVal conn As String, ByVal idProveedor As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim pro As New ClassSigeco.ClassSigeco.si_proveedor(conn)
            pro.Where.IdProveedor.Value = idProveedor

            If pro.Query.Load Then

                pro.MarkAsDeleted()
                pro.Save()

            End If

            tx.CommitTransaction()
            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function get_Proveedores_All(ByVal conn As String, ByVal idProveedor As Integer, ByVal proveedor As String, _
                                        ByVal ruc As String, ByVal habilitados As Boolean) As DataTable
        Try

            Dim vPro As New ClassSigeco.ClassSigeco.vw_proveedores(conn)

            If idProveedor > 0 Then
                vPro.Where.IdProveedor.Value = idProveedor
            End If

            If proveedor <> "" Then
                vPro.Where.Proveedor.Value = "%" & proveedor & "%"
                vPro.Where.Proveedor.Operator = WhereParameter.Operand.Like
            End If

            If ruc <> "" Then
                vPro.Where.Ruc.Value = "%" & ruc & "%"
                vPro.Where.Ruc.Operator = WhereParameter.Operand.Like
            End If

            If habilitados Then
                vPro.Where.Habilitado.Value = habilitados
            End If

            vPro.Query.AddOrderBy("proveedor", WhereParameter.Dir.ASC)

            If vPro.Query.Load Then
                If vPro.DefaultView.Table.Rows.Count > 0 Then
                    Return vPro.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

#End Region

#Region "Bancos"

    Public Function get_Bancos_All(ByVal conn As String) As DataTable
        Try

            Dim vVentas As New ClassSigeco.ClassSigeco.si_banco(conn)
            vVentas.Where.Habilitado.Value = True

            vVentas.Query.AddOrderBy("Banco", WhereParameter.Dir.ASC)

            If vVentas.Query.Load Then
                If vVentas.DefaultView.Table.Rows.Count > 0 Then
                    Return vVentas.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

#End Region

#Region "OP"

    Public Function Insert_OrdenPago(ByVal conn As String, ByVal nroComprobante As String, ByVal fecha As DateTime, _
                                ByVal idProveedor As Integer, ByVal concepto As String, _
                                ByVal estado As String, _
                                ByVal idUsuario As Integer) As Integer

        Dim tx As TransactionMgr

        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim ventas As New ClassSigeco.ClassSigeco.si_ordenPago(conn)
            ventas.AddNew()

            ventas.NroOrden = nroComprobante
            ventas.Fecha = fecha
            ventas.IdProveedor = idProveedor
            ventas.Concepto = concepto
            ventas.Estado = estado
            ventas.ActualizadoPor = idUsuario
            ventas.ActualizadoFecha = DateTime.Now
            ventas.Save()

            tx.CommitTransaction()

            Return ventas.IdOrdenPago

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return 0
        End Try

    End Function

    Public Function Update_OrdenPago(ByVal conn As String, ByVal idOrdenPago As Integer, _
                                     ByVal nroComprobante As String, ByVal fecha As DateTime, _
                                ByVal idProveedor As Integer, ByVal concepto As String, _
                                ByVal estado As String, _
                                ByVal idUsuario As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim ventas As New ClassSigeco.ClassSigeco.si_ordenPago(conn)
            ventas.Where.IdOrdenPago.Value = idOrdenPago

            If ventas.Query.Load Then

                ventas.NroOrden = nroComprobante
                ventas.Fecha = fecha
                ventas.IdProveedor = idProveedor
                ventas.Concepto = concepto
                ventas.Estado = estado
                ventas.ActualizadoPor = idUsuario
                ventas.ActualizadoFecha = DateTime.Now

                ventas.Save()

            End If

            tx.CommitTransaction()
            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function Update_OrdenPago_Estado(ByVal conn As String, ByVal idOrdenPago As Integer, _
                                     ByVal estado As String, ByVal codUsuario As Integer, _
                                     ByVal nroComprobante As String) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim Ventas As New ClassSigeco.ClassSigeco.si_ordenPago(conn)
            Ventas.Where.IdOrdenPago.Value = idOrdenPago

            If Ventas.Query.Load Then

                Ventas.NroOrden = nroComprobante
                Ventas.Estado = estado
                Ventas.ActualizadoPor = codUsuario
                Ventas.ActualizadoFecha = DateTime.Now
                Ventas.Save()

                If estado = "ANULADO" Then

                    Dim detalle As New ClassSigeco.ClassSigeco.si_ordenPago_detalle(conn)
                    detalle.Where.IdOrdenPago.Value = idOrdenPago
                    If detalle.Query.Load Then

                        For i As Integer = 0 To detalle.DefaultView.Table.Rows.Count - 1

                            Dim loteMercaderia As New ClassSigeco.ClassSigeco.si_compra(conn)
                            loteMercaderia.Where.IdCompra.Value = detalle.DefaultView.Table.Rows(i)("IdCompra")
                            If loteMercaderia.Query.Load Then

                                loteMercaderia.TotalFacturaSaldo = loteMercaderia.TotalFacturaSaldo + detalle.DefaultView.Table.Rows(i)("Monto")
                                loteMercaderia.Save()

                            End If

                        Next

                    End If

                End If

            End If

            tx.CommitTransaction()
            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function Delete_OrdenPago(ByVal conn As String, ByVal idOrdenPago As Integer, ByVal codUsuario As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim Ventas As New ClassSigeco.ClassSigeco.si_ordenPago(conn)
            Ventas.Where.IdOrdenPago.Value = idOrdenPago

            If Ventas.Query.Load Then

                Dim detalle As New ClassSigeco.ClassSigeco.si_ordenPago_detalle(conn)
                detalle.Where.IdOrdenPago.Value = idOrdenPago
                If detalle.Query.Load Then

                    For i As Integer = 0 To detalle.DefaultView.Table.Rows.Count - 1

                        Dim loteMercaderia As New ClassSigeco.ClassSigeco.si_compra(conn)
                        loteMercaderia.Where.IdCompra.Value = detalle.DefaultView.Table.Rows(i)("IdCompra")
                        If loteMercaderia.Query.Load Then

                            loteMercaderia.TotalFacturaSaldo = loteMercaderia.TotalFacturaSaldo + detalle.DefaultView.Table.Rows(i)("Monto")
                            loteMercaderia.Save()

                        End If

                    Next

                End If

                Ventas.MarkAsDeleted()
                Ventas.Save()

            End If

            tx.CommitTransaction()
            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function get_OrdenPago_All(ByVal conn As String, ByVal idOrdenPago As Integer, ByVal fechaInicio As DateTime, _
                                   ByVal fechaFin As DateTime, ByVal cliente As String, _
                                   ByVal estado As String, ByVal nroComprobante As String, ByVal ruc As String, _
                                   ByVal codProveedor As Integer) As DataTable
        Try

            Dim vVentas As New ClassSigeco.ClassSigeco.vw_ordenPago(conn)

            If idOrdenPago > 0 Then
                vVentas.Where.IdOrdenPago.Value = idOrdenPago
            End If

            If codProveedor > 0 Then
                vVentas.Where.IdProveedor.Value = codProveedor
            End If

            If nroComprobante <> "" Then
                vVentas.Where.NroOrden.Value = "%" & nroComprobante & "%"
                vVentas.Where.NroOrden.Operator = WhereParameter.Operand.Like
            Else
                vVentas.Where.Fecha.BetweenBeginValue = New DateTime(fechaInicio.Year, fechaInicio.Month, fechaInicio.Day, 0, 0, 0)
                vVentas.Where.Fecha.BetweenEndValue = New DateTime(fechaFin.Year, fechaFin.Month, fechaFin.Day, 23, 59, 59)
                vVentas.Where.Fecha.Operator = WhereParameter.Operand.Between
            End If

            If estado <> "" Then
                vVentas.Where.Estado.Value = estado
            End If

            If cliente <> "" Then
                vVentas.Where.Proveedor.Value = "%" + cliente + "%"
                vVentas.Where.Proveedor.Operator = WhereParameter.Operand.Like
            End If

            'If ruc <> "" Then
            '    vVentas.Where.Ruc.Value = "%" + ruc + "%"
            '    vVentas.Where.Ruc.Operator = WhereParameter.Operand.Like
            'End If

            vVentas.Query.AddOrderBy("fecha", WhereParameter.Dir.DESC)

            If vVentas.Query.Load Then
                If vVentas.DefaultView.Table.Rows.Count > 0 Then
                    Return vVentas.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_OrdenPago_ByID(ByVal conn As String, ByVal idOrdenPago As Integer) As DataTable
        Try

            Dim vVentas As New ClassSigeco.ClassSigeco.vw_ordenPago(conn)

            If idOrdenPago > 0 Then
                vVentas.Where.IdOrdenPago.Value = idOrdenPago
            End If

            If vVentas.Query.Load Then
                If vVentas.DefaultView.Table.Rows.Count > 0 Then
                    Return vVentas.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_OrdenPago_Documento(ByVal conn As String, _
                                         ByVal documento As String, ByVal codUsuario As Integer) As String
        Try

            Dim vVentas As New ClassSigeco.ClassSigeco.si_documentos(conn)
            Dim numeroFactura As String = ""

            vVentas.Where.Documento.Value = documento
            vVentas.Where.Habilitado.Value = True
            'vVentas.Where.FechaVto.Value = DateTime.Now
            'vVentas.Where.FechaVto.Operator = WhereParameter.Operand.LessThanOrEqual

            If vVentas.Query.Load Then

                If vVentas.DefaultView.Table.Rows.Count > 0 Then

                    numeroFactura = vVentas.DefaultView.Table.Rows(0)("prefijo") & _
                    vVentas.DefaultView.Table.Rows(0)("numeroActual").ToString().PadLeft(7, "0")

                    vVentas.NumeroActual = vVentas.NumeroActual + 1
                    vVentas.ActualizadoPor = codUsuario
                    vVentas.ActualizadoFecha = DateTime.Now
                    vVentas.Save()

                    Return numeroFactura

                Else
                    Return ""
                End If

            Else

                Return ""

            End If

        Catch ex As Exception
            MessageError = ex
            Return ""
        End Try

    End Function

    Public Function Insert_OrdenPago_Detalle(ByVal conn As String, ByVal idOrdenPago As Integer, _
                                           ByVal idCompra As Integer, ByVal monto As Decimal, _
                                           ByVal obs As String, ByVal formaPago As String, _
                                           ByVal idUsuario As Integer, ByVal idCaja As Integer, _
                                           ByVal esCajero As Boolean, ByVal idBanco As Integer, _
                                           ByVal nroCheque As String, ByVal titular As String, _
                                           ByVal fechaDiferido As String) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim loteMercaderia As New ClassSigeco.ClassSigeco.si_compra(conn)
            loteMercaderia.Where.IdCompra.Value = idCompra
            If loteMercaderia.Query.Load Then

                If loteMercaderia.Condicion = "CREDITO" Then
                    loteMercaderia.TotalFacturaSaldo = loteMercaderia.TotalFacturaSaldo - monto
                    If loteMercaderia.TotalFacturaSaldo < 0 Then
                        Throw New Exception("El monto pagado supera el monto de la deuda.")
                    End If
                    loteMercaderia.Save()
                End If

            End If

            Dim cabecera As New ClassSigeco.ClassSigeco.si_ordenPago(conn)
            cabecera.Where.IdOrdenPago.Value = idOrdenPago
            If cabecera.Query.Load Then
                cabecera.ActualizadoPor = idUsuario
                cabecera.ActualizadoFecha = DateTime.Now
                cabecera.Save()
            End If

            Dim detalle As New ClassSigeco.ClassSigeco.si_ordenPago_detalle(conn)

            detalle.AddNew()
            detalle.IdOrdenPago = idOrdenPago
            detalle.IdCompra = idCompra
            detalle.Observaciones = obs
            detalle.FormaPago = formaPago
            detalle.Monto = monto
            detalle.IdCaja = idCaja
            detalle.FechaCaja = DateTime.Now

            If idBanco > 0 Then
                detalle.IdBanco = idBanco
                detalle.Titular = titular
                detalle.NroCheque = nroCheque
                If fechaDiferido <> "" Then
                    detalle.FechaChequeDiferido = DateTime.Parse(fechaDiferido)
                End If
            End If

            detalle.Save()

            If idCaja > 0 Then
                Dim cajas As New ClassSigeco.ClassSigeco.si_caja(conn)
                cajas.Where.IdMovimientoCaja.Value = idCaja
                If cajas.Query.Load Then

                    If Not formaPago.Contains("CREDITO") And Not formaPago.Contains("CHEQUE") Then

                        If (cajas.SaldoEfectivo - monto) < 0 Then
                            Throw New Exception("No posee saldo suficiente en caja para registrar pago.")
                        End If

                        cajas.MontoCierre -= monto

                    End If

                    If Not formaPago.Contains("CREDITO") And Not formaPago.Contains("CHEQUE") Then
                        cajas.SaldoEfectivo -= monto
                    End If

                    cajas.Save()

                End If

            ElseIf esCajero Then
                Throw New Exception("No posee caja abierta, favor verifique.")
            End If

            tx.CommitTransaction()

            Return True

        Catch ex As Exception

            tx.RollbackTransaction()
            'If ex.Message.Contains("ix_mercaderia") Then
            '    MessageError = New Exception("No puede ingresar la misma mercaderia en una misma venta, favor verifique.")
            'Else
            MessageError = ex
            'End If

            Return False

        End Try

    End Function

    Public Function Delete_OrdenPago_Detalle(ByVal conn As String, ByVal idOrdenPagoDetalle As Integer, _
                                           ByVal codUsuario As Integer, ByVal idOrdenPago As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim detalle As New ClassSigeco.ClassSigeco.si_ordenPago_detalle(conn)

            detalle.Where.IdOrdenPagoDetalle.Value = idOrdenPagoDetalle

            If detalle.Query.Load Then


                Dim loteMercaderia As New ClassSigeco.ClassSigeco.si_compra(conn)
                loteMercaderia.Where.IdCompra.Value = detalle.IdCompra
                If loteMercaderia.Query.Load Then

                    If loteMercaderia.Condicion = "CREDITO" Then
                        loteMercaderia.TotalFacturaSaldo = loteMercaderia.TotalFacturaSaldo + detalle.Monto
                        loteMercaderia.Save()
                    End If

                End If

                detalle.MarkAsDeleted()
                detalle.Save()

            End If

            tx.CommitTransaction()

            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function get_OrdenPago_Detalles_All(ByVal conn As String, ByVal idOrdenPago As Integer) As DataTable
        Try

            Dim vDetalle As New ClassSigeco.ClassSigeco.vw_ordenPago_detalle(conn)

            If idOrdenPago > 0 Then
                vDetalle.Where.IdOrdenPago.Value = idOrdenPago
            End If

            If vDetalle.Query.Load Then
                If vDetalle.DefaultView.Table.Rows.Count > 0 Then
                    Return vDetalle.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_OrdenPago_Pago_All(ByVal conn As String, ByVal codCompra As Integer) As DataTable
        Try

            Dim vDetalle As New ClassSigeco.ClassSigeco.vw_ordenPago_detalle(conn)

            If codCompra > 0 Then
                vDetalle.Where.IdCompra.Value = codCompra
            End If

            If vDetalle.Query.Load Then
                If vDetalle.DefaultView.Table.Rows.Count > 0 Then
                    Return vDetalle.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_OrdenPago_Detalles_ByID(ByVal conn As String, ByVal idOrdenPagoDetalle As Integer) As DataTable
        Try

            Dim vDetalle As New ClassSigeco.ClassSigeco.vw_ordenPago_detalle(conn)

            vDetalle.Where.idOrdenPagoDetalle.Value = idOrdenPagoDetalle

            If vDetalle.Query.Load Then
                If vDetalle.DefaultView.Table.Rows.Count > 0 Then
                    Return vDetalle.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

#End Region

#Region "Compras"

    Public Function Insert_Compras(ByVal conn As String, ByVal nroComprobante As String, ByVal fecha As DateTime, _
                                   ByVal idProveedor As Integer, ByVal fechaVto As String, _
        ByVal condicion As String, ByVal estado As String, ByVal idOrdeCompra As Integer, _
        ByVal idAdministrador As Integer, ByVal total As Decimal, ByVal saldo As Decimal, ByVal totalIva As Decimal, _
        ByVal idUsuario As Integer, ByVal idNotaRemision As Integer) As Integer

        Dim tx As TransactionMgr

        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim ventas As New ClassSigeco.ClassSigeco.si_compra(conn)
            ventas.AddNew()

            ventas.NroComprobante = nroComprobante
            ventas.Fecha = fecha
            ventas.IdProveedor = idProveedor

            If fechaVto <> "" Then
                ventas.FechaVencimiento = DateTime.Parse(fechaVto)
            End If

            ventas.Condicion = condicion
            ventas.Estado = estado

            If idOrdeCompra > 0 Then
                ventas.IdOrdenCompra = idOrdeCompra
            End If

            If idAdministrador > 0 Then
                ventas.IdAdministrador = idAdministrador
            End If

            ventas.TotalFactura = total
            ventas.TotalFacturaIVA = totalIva

            If condicion = "CONTADO" Then
                ventas.TotalFacturaSaldo = 0
            Else
                ventas.TotalFacturaSaldo = ventas.TotalFactura
            End If

            ventas.ActualizadoPor = idUsuario
            ventas.ActualizadoFecha = DateTime.Now

            ventas.Save()

            If idNotaRemision > 0 Then

                Dim nota As New ClassSigeco.ClassSigeco.si_notaRemision(conn)
                nota.Where.IdNotaRemision.Value = idNotaRemision
                If nota.Query.Load Then
                    nota.IdCompra = ventas.IdCompra
                    nota.Save()
                End If

            End If

            tx.CommitTransaction()

            Return ventas.IdCompra

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return 0
        End Try

    End Function

    Public Function Insert_Compras(ByVal conn As String, ByVal nroComprobante As String, ByVal fecha As DateTime, _
                                   ByVal idProveedor As Integer, ByVal fechaVto As String, _
        ByVal condicion As String, ByVal estado As String, ByVal idOrdeCompra As Integer, _
        ByVal idAdministrador As Integer, ByVal total As Decimal, ByVal saldo As Decimal, ByVal totalIva As Decimal, _
        ByVal idUsuario As Integer, ByVal idNotaRemision As Integer, ByVal idMovimientoCaja As Integer) As Integer

        Dim tx As TransactionMgr

        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim ventas As New ClassSigeco.ClassSigeco.si_compra(conn)
            ventas.AddNew()

            ventas.NroComprobante = nroComprobante
            ventas.Fecha = fecha
            ventas.IdProveedor = idProveedor
            ventas.IdCaja = idMovimientoCaja
            If fechaVto <> "" Then
                ventas.FechaVencimiento = DateTime.Parse(fechaVto)
            End If

            ventas.Condicion = condicion
            ventas.Estado = estado

            If idOrdeCompra > 0 Then
                ventas.IdOrdenCompra = idOrdeCompra
            End If

            If idAdministrador > 0 Then
                ventas.IdAdministrador = idAdministrador
            End If

            ventas.TotalFactura = total
            ventas.TotalFacturaIVA = totalIva

            If condicion = "CONTADO" Then
                ventas.TotalFacturaSaldo = 0
            Else
                ventas.TotalFacturaSaldo = ventas.TotalFactura
            End If

            ventas.ActualizadoPor = idUsuario
            ventas.ActualizadoFecha = DateTime.Now

            ventas.Save()

            If idNotaRemision > 0 Then

                Dim nota As New ClassSigeco.ClassSigeco.si_notaRemision(conn)
                nota.Where.IdNotaRemision.Value = idNotaRemision
                If nota.Query.Load Then
                    nota.IdCompra = ventas.IdCompra
                    nota.Save()
                End If

            End If

            tx.CommitTransaction()

            Return ventas.IdCompra

        Catch ex As Exception
            tx.RollbackTransaction()
            If ex.Message.Contains("Cannot insert the value NULL into column 'nroComprobante'") Then
                MessageError = New Exception("Debe ingresar un Nro. de comprobante a la operación.")
            Else
                MessageError = ex
            End If

            Return 0
        End Try

    End Function

    Public Function Insert_Orden_Compras(ByVal conn As String, ByVal nroComprobante As String, ByVal fecha As DateTime, _
                                    ByVal idProveedor As Integer, _
                                    ByVal fechaVigencia As DateTime, ByVal condicion As String, _
                                    ByVal idUsuario As Integer) As Integer

        Dim tx As TransactionMgr

        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim ventas As New ClassSigeco.ClassSigeco.si_ordenCompra(conn)
            ventas.AddNew()

            ventas.NroComprobante = nroComprobante
            ventas.FechaOrden = fecha
            ventas.FechaVigencia = fechaVigencia
            ventas.IdProveedor = idProveedor
            ventas.Condicion = condicion
            ventas.SetColumnNull("IdAdministrador")

            ventas.ActualizadoPor = idUsuario
            ventas.ActualizadoFecha = DateTime.Now

            ventas.Save()

            tx.CommitTransaction()

            Return ventas.IdOrdenCompra

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return 0
        End Try

    End Function

    Public Function Update_Compras(ByVal conn As String, ByVal idCompra As Integer, _
                                     ByVal nroComprobante As String, ByVal fecha As DateTime, _
                                   ByVal idProveedor As Integer, ByVal fechaVto As String, _
        ByVal condicion As String, ByVal estado As String, ByVal idOrdeCompra As Integer, _
        ByVal idAdministrador As Integer, ByVal total As Decimal, ByVal saldo As Decimal, ByVal totalIva As Decimal, _
        ByVal idUsuario As Integer, ByVal idNotaRemision As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim ventas As New ClassSigeco.ClassSigeco.si_compra(conn)
            ventas.Where.IdCompra.Value = idCompra

            If ventas.Query.Load Then

                ventas.NroComprobante = nroComprobante
                ventas.Fecha = fecha
                ventas.IdProveedor = idProveedor

                If fechaVto <> "" Then
                    ventas.FechaVencimiento = DateTime.Parse(fechaVto)
                End If

                ventas.Condicion = condicion
                ventas.Estado = estado

                If idOrdeCompra > 0 Then
                    ventas.IdOrdenCompra = idOrdeCompra
                End If

                If idAdministrador > 0 Then
                    ventas.IdAdministrador = idAdministrador
                End If

                ventas.TotalFactura = total
                ventas.TotalFacturaIVA = totalIva

                If condicion = "CONTADO" Then
                    ventas.TotalFacturaSaldo = 0
                Else
                    ventas.TotalFacturaSaldo = ventas.TotalFactura
                End If

                ventas.ActualizadoPor = idUsuario
                ventas.ActualizadoFecha = DateTime.Now

                ventas.Save()

                If idNotaRemision > 0 Then

                    Dim nota As New ClassSigeco.ClassSigeco.si_notaRemision(conn)
                    nota.Where.IdNotaRemision.Value = idNotaRemision
                    If nota.Query.Load Then
                        nota.IdCompra = ventas.IdCompra
                        nota.Save()
                    End If

                End If

            End If

            tx.CommitTransaction()
            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function Update_Orden_Compras(ByVal conn As String, ByVal idOrdenCompra As Integer, _
                                        ByVal nroComprobante As String, ByVal fecha As DateTime, _
                                        ByVal idProveedor As Integer, ByVal idAdministrador As Integer, _
                                        ByVal fechaVigencia As DateTime, ByVal condicion As String, _
                                        ByVal idUsuario As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim ventas As New ClassSigeco.ClassSigeco.si_ordenCompra(conn)
            ventas.Where.IdOrdenCompra.Value = idOrdenCompra

            If ventas.Query.Load Then

                ventas.NroComprobante = nroComprobante
                ventas.FechaOrden = fecha
                ventas.FechaVigencia = fechaVigencia
                ventas.IdProveedor = idProveedor
                ventas.Condicion = condicion
                ventas.IdAdministrador = idAdministrador

                ventas.ActualizadoPor = idUsuario
                ventas.ActualizadoFecha = DateTime.Now

                ventas.Save()

            End If

            tx.CommitTransaction()
            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function Update_Orden_Compras_Estado(ByVal conn As String, ByVal idOrdenCompra As Integer, _
                                        ByVal idAdministrador As Integer, _
                                        ByVal idUsuario As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim ventas As New ClassSigeco.ClassSigeco.si_ordenCompra(conn)
            ventas.Where.IdOrdenCompra.Value = idOrdenCompra

            If ventas.Query.Load Then

                ventas.IdAdministrador = idAdministrador
                ventas.ActualizadoPor = idUsuario
                ventas.ActualizadoFecha = DateTime.Now

                ventas.Save()

            End If

            tx.CommitTransaction()
            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function Update_Compras_Estado(ByVal conn As String, ByVal idCompra As Integer, _
    ByVal estadoCompra As String, ByVal codUsuario As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim compras As New ClassSigeco.ClassSigeco.si_compra(conn)
            compras.Where.IdCompra.Value = idCompra

            If compras.Query.Load Then
                compras.Estado = estadoCompra
                compras.ActualizadoPor = codUsuario
                compras.ActualizadoFecha = DateTime.Now
                compras.Save()

                If estadoCompra = "ANULADA" Then

                    Dim detalle As New ClassSigeco.ClassSigeco.si_compra_detalle(conn)
                    detalle.Where.IdCompra.Value = idCompra
                    If detalle.Query.Load Then

                        For i As Integer = 0 To detalle.DefaultView.Table.Rows.Count - 1

                            If Not detalle.DefaultView.Table.Rows(i)("IdMercaderiaLote") Is DBNull.Value Then
                                If detalle.DefaultView.Table.Rows(i)("IdMercaderiaLote") > 0 Then
                                    Dim lote As New ClassSigeco.ClassSigeco.si_mercaderiaLote(conn)
                                    lote.Where.IdMercaderiaLote.Value = detalle.DefaultView.Table.Rows(i)("IdMercaderiaLote")
                                    If lote.Query.Load Then
                                        If lote.Cantidad = lote.Saldo Then
                                            lote.Saldo = lote.Cantidad
                                            lote.IdUsuarioBaja = codUsuario
                                            lote.FechaBaja = DateTime.Now
                                            lote.Save()
                                        Else
                                            Throw New Exception("Posee lotes de mercaderia ya en uso, favor verifique sus ventas.")
                                        End If
                                    End If
                                End If
                            End If

                        Next

                    End If

                End If

            End If

            tx.CommitTransaction()
            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function Update_Remisiones_Estado(ByVal conn As String, ByVal idNotaRemision As Integer, _
    ByVal estadoRemision As String, ByVal codUsuario As Integer, ByVal nroRemision As String) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim controllerVtas As New controller_ventas()

            Dim compras As New ClassSigeco.ClassSigeco.si_notaRemision(conn)
            compras.Where.IdNotaRemision.Value = idNotaRemision

            If compras.Query.Load Then

                compras.Estado = estadoRemision
                compras.NroComprobante = nroRemision
                compras.ActualizadoPor = codUsuario
                compras.ActualizadoFecha = DateTime.Now
                compras.Save()

                If estadoRemision = "APROBADA" Then

                    If Not compras.IsColumnNull("idVenta") Then
                        If compras.IdVenta > 0 Then

                            Dim idNotaVenta As Integer = 0

                            idNotaVenta = controllerVtas.Insert_NotasCredito(conn, compras.Fecha, compras.IdCliente, codUsuario, compras.IdVenta)

                            If idNotaVenta > 0 Then

                                Dim notaDetalle As New si_notaRemision_detalle(conn)
                                notaDetalle.Where.IdNotaRemision.Value = idNotaRemision

                                If notaDetalle.Query.Load Then

                                    For i As Integer = 0 To notaDetalle.DefaultView.Table.Rows.Count - 1

                                        Dim ventasDetalle As New si_venta_detalle(conn)
                                        ventasDetalle.Where.IdVenta.Value = compras.IdVenta
                                        ventasDetalle.Where.IdMercaderia.Value = notaDetalle.DefaultView.Table.Rows(i)("IdMercaderia")
                                        'ventasDetalle.Where.IdMercaderiaLote.Value = notaDetalle.DefaultView.Table.Rows(i)("IdMercaderiaLote")

                                        If ventasDetalle.Query.Load Then

                                            controllerVtas.Insert_NotasCredito_Detalle_Non(conn, idNotaVenta, _
                                                                                       notaDetalle.DefaultView.Table.Rows(i)("Cantidad"), _
                                                                                       "DEVOLUCION DE MERCADERIA", _
                                                                                       ventasDetalle.IdImpuesto, _
                                                                                       ventasDetalle.Precio * notaDetalle.DefaultView.Table.Rows(i)("Cantidad"), _
                                                                                       compras.IdVenta, 0)

                                        End If

                                    Next

                                End If

                            Else
                                If Not controllerVtas.MessageError Is Nothing Then

                                    Throw New Exception("Error NC", controllerVtas.MessageError)

                                End If

                            End If

                        End If
                    End If

                End If

                If estadoRemision = "ANULADA" Then

                    Dim detalle As New ClassSigeco.ClassSigeco.si_notaRemision_detalle(conn)
                    detalle.Where.IdNotaRemision.Value = idNotaRemision
                    If detalle.Query.Load Then

                        For i As Integer = 0 To detalle.DefaultView.Table.Rows.Count - 1

                            If Not detalle.DefaultView.Table.Rows(i)("IdMercaderiaLote") Is DBNull.Value Then
                                If detalle.DefaultView.Table.Rows(i)("IdMercaderiaLote") > 0 Then
                                    Dim lote As New ClassSigeco.ClassSigeco.si_mercaderiaLote(conn)
                                    lote.Where.IdMercaderiaLote.Value = detalle.DefaultView.Table.Rows(i)("IdMercaderiaLote")
                                    If lote.Query.Load Then
                                        If lote.Cantidad = lote.Saldo Then
                                            lote.Saldo = lote.Cantidad
                                            lote.IdUsuarioBaja = codUsuario
                                            lote.FechaBaja = DateTime.Now
                                            lote.Save()
                                        Else
                                            Throw New Exception("Posee lotes de mercaderia ya en uso, favor verifique sus ventas.")
                                        End If
                                    End If
                                End If
                            End If

                        Next

                    End If

                End If

            End If

            tx.CommitTransaction()
            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function Update_Remisiones_Estado_NonTransacc(ByVal conn As String, ByVal idNotaRemision As Integer, _
    ByVal estadoRemision As String, ByVal codUsuario As Integer, ByVal nroRemision As String) As Boolean

        Try

            Dim compras As New ClassSigeco.ClassSigeco.si_notaRemision(conn)
            compras.Where.IdNotaRemision.Value = idNotaRemision

            If compras.Query.Load Then
                compras.Estado = estadoRemision
                compras.NroComprobante = nroRemision
                compras.ActualizadoPor = codUsuario
                compras.ActualizadoFecha = DateTime.Now
                compras.Save()

                If estadoRemision = "ANULADA" Then

                    'Dim detalle As New ClassSigeco.ClassSigeco.si_notaRemision_detalle(conn)
                    'detalle.Where.IdNotaRemision.Value = idNotaRemision
                    'If detalle.Query.Load Then

                    '    For i As Integer = 0 To detalle.DefaultView.Table.Rows.Count - 1

                    '        If Not detalle.DefaultView.Table.Rows(i)("IdMercaderiaLote") Is DBNull.Value Then
                    '            If detalle.DefaultView.Table.Rows(i)("IdMercaderiaLote") > 0 Then
                    '                Dim lote As New ClassSigeco.ClassSigeco.si_mercaderiaLote(conn)
                    '                lote.Where.IdMercaderiaLote.Value = detalle.DefaultView.Table.Rows(i)("IdMercaderiaLote")
                    '                If lote.Query.Load Then
                    '                    If lote.Cantidad = lote.Saldo Then
                    '                        lote.Saldo = lote.Cantidad
                    '                        lote.IdUsuarioBaja = codUsuario
                    '                        lote.FechaBaja = DateTime.Now
                    '                        lote.Save()
                    '                    Else
                    '                        Throw New Exception("Posee lotes de mercaderia ya en uso, favor verifique sus ventas.")
                    '                    End If
                    '                End If
                    '            End If
                    '        End If

                    '    Next

                    'End If

                End If

            End If


            Return True

        Catch ex As Exception

            MessageError = ex
            Return False
        End Try

    End Function

    Public Function Delete_Compras(ByVal conn As String, ByVal idCompra As Integer, ByVal codUsuario As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim compras As New ClassSigeco.ClassSigeco.si_compra(conn)
            compras.Where.IdCompra.Value = idCompra

            If compras.Query.Load Then

                Dim detalle As New ClassSigeco.ClassSigeco.si_compra_detalle(conn)
                detalle.Where.IdCompra.Value = idCompra
                If detalle.Query.Load Then

                    For i As Integer = 0 To detalle.DefaultView.Table.Rows.Count - 1

                        If Not detalle.DefaultView.Table.Rows(i)("IdMercaderiaLote") Is DBNull.Value Then
                            If detalle.DefaultView.Table.Rows(i)("IdMercaderiaLote") > 0 Then
                                Dim lote As New ClassSigeco.ClassSigeco.si_mercaderiaLote(conn)
                                lote.Where.IdMercaderiaLote.Value = detalle.DefaultView.Table.Rows(i)("IdMercaderiaLote")
                                If lote.Query.Load Then
                                    If lote.Cantidad = lote.Saldo Then
                                        lote.MarkAsDeleted()
                                        lote.Save()
                                    Else
                                        Throw New Exception("Posee lotes de mercaderia ya en uso, favor verifique sus ventas.")
                                    End If
                                End If
                            End If
                        End If

                    Next

                End If

                compras.MarkAsDeleted()
                compras.Save()

            End If

            tx.CommitTransaction()
            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function Delete_Orden_Compras(ByVal conn As String, ByVal idOrdenCompra As Integer, ByVal codUsuario As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim compras As New ClassSigeco.ClassSigeco.si_ordenCompra(conn)
            compras.Where.IdOrdenCompra.Value = idOrdenCompra

            If compras.Query.Load Then

                compras.MarkAsDeleted()
                compras.Save()

            End If

            tx.CommitTransaction()
            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function get_Caja_All(ByVal conn As String, ByVal fechaInicio As DateTime, _
                                   ByVal fechaFin As DateTime, ByVal IdMovimientoCaja As Integer) As DataTable
        Try

            Dim vCompras As New ClassSigeco.ClassSigeco.vw_caja(conn)

            If IdMovimientoCaja > 0 Then
                vCompras.Where.IdMovimientoCaja.Value = IdMovimientoCaja
            Else
                vCompras.Where.FechaApertura.BetweenBeginValue = New DateTime(fechaInicio.Year, fechaInicio.Month, fechaInicio.Day, 0, 0, 0)
                vCompras.Where.FechaApertura.BetweenEndValue = New DateTime(fechaFin.Year, fechaFin.Month, fechaFin.Day, 23, 59, 59)
                vCompras.Where.FechaApertura.Operator = WhereParameter.Operand.Between
            End If

            vCompras.Query.AddOrderBy("FechaApertura", WhereParameter.Dir.DESC)

            If vCompras.Query.Load Then
                If vCompras.DefaultView.Table.Rows.Count > 0 Then
                    Return vCompras.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_Compras_All(ByVal conn As String, ByVal idCompra As Integer, ByVal fechaInicio As DateTime, _
                                   ByVal fechaFin As DateTime, ByVal condicion As String, ByVal proveedor As String, _
                                   ByVal estado As String, ByVal nroFactura As String, ByVal ruc As String, _
                                   ByVal codProveedor As Integer, ByVal conSaldo As Boolean, ByVal conGasto As String) As DataTable
        Try

            Dim vCompras As New ClassSigeco.ClassSigeco.vw_compras(conn)

            If conGasto = "NO" Then
                vCompras.Where.EsGasto.Value = conGasto
            ElseIf conGasto = "SI" Then
                vCompras.Where.EsGasto.Value = conGasto
            End If

            If idCompra > 0 Then
                vCompras.Where.IdCompra.Value = idCompra
            End If

            If codProveedor > 0 Then
                vCompras.Where.IdProveedor.Value = codProveedor
            End If

            If nroFactura <> "" Then
                vCompras.Where.NroComprobante.Value = "%" & nroFactura & "%"
                vCompras.Where.NroComprobante.Operator = WhereParameter.Operand.Like
            Else
                vCompras.Where.Fecha.BetweenBeginValue = New DateTime(fechaInicio.Year, fechaInicio.Month, fechaInicio.Day, 0, 0, 0)
                vCompras.Where.Fecha.BetweenEndValue = New DateTime(fechaFin.Year, fechaFin.Month, fechaFin.Day, 23, 59, 59)
                vCompras.Where.Fecha.Operator = WhereParameter.Operand.Between
            End If

            If condicion <> "" Then
                vCompras.Where.Condicion.Value = condicion
            End If

            If estado <> "" Then
                vCompras.Where.Estado.Value = estado
            End If

            If proveedor <> "" Then
                vCompras.Where.Proveedor.Value = "%" + proveedor + "%"
                vCompras.Where.Proveedor.Operator = WhereParameter.Operand.Like
            End If

            If ruc <> "" Then
                vCompras.Where.Ruc.Value = "%" + ruc + "%"
                vCompras.Where.Ruc.Operator = WhereParameter.Operand.Like
            End If

            If conSaldo Then
                vCompras.Where.TotalFacturaSaldo.Value = 0
                vCompras.Where.TotalFacturaSaldo.Operator = WhereParameter.Operand.GreaterThan
            End If

            vCompras.Query.AddOrderBy("fecha", WhereParameter.Dir.DESC)

            If vCompras.Query.Load Then
                If vCompras.DefaultView.Table.Rows.Count > 0 Then
                    Return vCompras.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_Compras_Contado_All(ByVal conn As String, ByVal idCompra As Integer, ByVal fechaInicio As DateTime, _
                                   ByVal fechaFin As DateTime, ByVal condicion As String, ByVal proveedor As String, _
                                   ByVal estado As String, ByVal nroFactura As String, ByVal ruc As String, _
                                   ByVal codProveedor As Integer) As DataTable
        Try

            Dim vCompras As New ClassSigeco.ClassSigeco.vw_compras(conn)

            vCompras.Where.EsGasto.Value = "NO"
            vCompras.Where.Saldo_pago.Value = 0
            vCompras.Where.Saldo_pago.Operator = WhereParameter.Operand.GreaterThan

            If idCompra > 0 Then
                vCompras.Where.IdCompra.Value = idCompra
            End If

            If codProveedor > 0 Then
                vCompras.Where.IdProveedor.Value = codProveedor
            End If

            If nroFactura <> "" Then
                vCompras.Where.NroComprobante.Value = "%" & nroFactura & "%"
                vCompras.Where.NroComprobante.Operator = WhereParameter.Operand.Like
            Else
                vCompras.Where.Fecha.BetweenBeginValue = New DateTime(fechaInicio.Year, fechaInicio.Month, fechaInicio.Day, 0, 0, 0)
                vCompras.Where.Fecha.BetweenEndValue = New DateTime(fechaFin.Year, fechaFin.Month, fechaFin.Day, 23, 59, 59)
                vCompras.Where.Fecha.Operator = WhereParameter.Operand.Between
            End If

            If condicion <> "" Then
                vCompras.Where.Condicion.Value = condicion
            End If

            If estado <> "" Then
                vCompras.Where.Estado.Value = estado
            End If

            If proveedor <> "" Then
                vCompras.Where.Proveedor.Value = "%" + proveedor + "%"
                vCompras.Where.Proveedor.Operator = WhereParameter.Operand.Like
            End If

            If ruc <> "" Then
                vCompras.Where.Ruc.Value = "%" + ruc + "%"
                vCompras.Where.Ruc.Operator = WhereParameter.Operand.Like
            End If

            vCompras.Query.AddOrderBy("fecha", WhereParameter.Dir.DESC)

            If vCompras.Query.Load Then
                If vCompras.DefaultView.Table.Rows.Count > 0 Then
                    Return vCompras.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function
    

    Public Function get_Compras_Devolucion(ByVal conn As String, ByVal codProveedor As Integer, _
                                           ByVal nroFactura As String, ByVal fechaInicio As DateTime, ByVal fechaFin As DateTime) As DataTable
        Try

            Dim vCompras As New ClassSigeco.ClassSigeco.vw_compras_listado_devolucion(conn)

            If codProveedor > 0 Then
                vCompras.Where.IdProveedor.Value = codProveedor
            End If

            If nroFactura <> "" Then
                vCompras.Where.NroComprobante.Value = "%" & nroFactura & "%"
                vCompras.Where.NroComprobante.Operator = WhereParameter.Operand.Like
            Else
                vCompras.Where.Fecha.BetweenBeginValue = New DateTime(fechaInicio.Year, fechaInicio.Month, fechaInicio.Day, 0, 0, 0)
                vCompras.Where.Fecha.BetweenEndValue = New DateTime(fechaFin.Year, fechaFin.Month, fechaFin.Day, 23, 59, 59)
                vCompras.Where.Fecha.Operator = WhereParameter.Operand.Between
            End If

            vCompras.Query.AddOrderBy("fecha", WhereParameter.Dir.DESC)

            If vCompras.Query.Load Then
                If vCompras.DefaultView.Table.Rows.Count > 0 Then
                    Return vCompras.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_Orden_Compras_All(ByVal conn As String, ByVal idOrdenCompra As Integer, ByVal fechaInicio As DateTime, _
                                    ByVal fechaFin As DateTime, ByVal condicion As String, ByVal proveedor As String, _
                                    ByVal nroComprobante As String, ByVal ruc As String, _
                                    ByVal codProveedor As Integer, _
                                    ByVal noAsignadas As Boolean, ByVal soloPendientes As Boolean) As DataTable
        Try

            Dim vCompras As New ClassSigeco.ClassSigeco.vw_ordenCompra(conn)

            If idOrdenCompra > 0 Then
                vCompras.Where.IdOrdenCompra.Value = idOrdenCompra
            End If

            If codProveedor > 0 Then
                vCompras.Where.IdProveedor.Value = codProveedor
            End If

            If soloPendientes Then
                vCompras.Where.ControlCompra.Value = 0
                vCompras.Where.ControlCompra.Operator = WhereParameter.Operand.IsNull
            End If

            If nroComprobante <> "" Then
                vCompras.Where.NroComprobante.Value = "%" & nroComprobante & "%"
                vCompras.Where.NroComprobante.Operator = WhereParameter.Operand.Like
            Else
                vCompras.Where.FechaOrden.BetweenBeginValue = New DateTime(fechaInicio.Year, fechaInicio.Month, fechaInicio.Day, 0, 0, 0)
                vCompras.Where.FechaOrden.BetweenEndValue = New DateTime(fechaFin.Year, fechaFin.Month, fechaFin.Day, 23, 59, 59)
                vCompras.Where.FechaOrden.Operator = WhereParameter.Operand.Between
            End If

            If condicion <> "" Then
                vCompras.Where.Condicion.Value = condicion
            End If

            If noAsignadas Then
                vCompras.Where.IdCompra.Value = 0
                vCompras.Where.IdCompra.Operator = WhereParameter.Operand.IsNull

                vCompras.Where.IdAdministrador.Value = 0
                vCompras.Where.IdAdministrador.Operator = WhereParameter.Operand.GreaterThan
            End If

            If proveedor <> "" Then
                vCompras.Where.Proveedor.Value = "%" + proveedor + "%"
                vCompras.Where.Proveedor.Operator = WhereParameter.Operand.Like
            End If

            If ruc <> "" Then
                vCompras.Where.Ruc.Value = "%" + ruc + "%"
                vCompras.Where.Ruc.Operator = WhereParameter.Operand.Like
            End If

            vCompras.Query.AddOrderBy("FechaOrden", WhereParameter.Dir.DESC)

            If vCompras.Query.Load Then
                If vCompras.DefaultView.Table.Rows.Count > 0 Then
                    Return vCompras.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_Compras_ByID(ByVal conn As String, ByVal idCompra As Integer) As DataTable
        Try

            Dim vCompras As New ClassSigeco.ClassSigeco.vw_compras(conn)

            If idCompra > 0 Then
                vCompras.Where.IdCompra.Value = idCompra
            End If

            If vCompras.Query.Load Then
                If vCompras.DefaultView.Table.Rows.Count > 0 Then
                    Return vCompras.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_Orden_Compras_ByNRO(ByVal conn As String, ByVal nroComprobante As String) As DataTable
        Try

            Dim vCompras As New ClassSigeco.ClassSigeco.vw_ordenCompra(conn)
            vCompras.Where.NroComprobante.Value = nroComprobante

            vCompras.Where.IdAdministrador.Value = 0
            vCompras.Where.IdAdministrador.Operator = WhereParameter.Operand.IsNotNull

            If vCompras.Query.Load Then
                If vCompras.DefaultView.Table.Rows.Count > 0 Then
                    Return vCompras.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_Orden_Compras_ByID(ByVal conn As String, ByVal idOrdenCompra As Integer) As DataTable
        Try

            Dim vCompras As New ClassSigeco.ClassSigeco.vw_ordenCompra(conn)

            If idOrdenCompra > 0 Then
                vCompras.Where.IdOrdenCompra.Value = idOrdenCompra
            End If

            If vCompras.Query.Load Then
                If vCompras.DefaultView.Table.Rows.Count > 0 Then
                    Return vCompras.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_Orden_Compras_Impresion_ByID(ByVal conn As String, ByVal idOrdenCompra As Integer) As DataTable
        Try

            Dim vCompras As New ClassSigeco.ClassSigeco.vw_orde_compra_impresion(conn)

            If idOrdenCompra > 0 Then
                vCompras.Where.IdOrdenCompra.Value = idOrdenCompra
            End If

            If vCompras.Query.Load Then
                If vCompras.DefaultView.Table.Rows.Count > 0 Then
                    Return vCompras.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_Orden_Compras_ByID_Compras(ByVal conn As String, ByVal idOrdenCompra As Integer) As DataTable
        Try

            Dim vCompras As New ClassSigeco.ClassSigeco.vw_ordenCompra(conn)

            If idOrdenCompra > 0 Then
                vCompras.Where.IdOrdenCompra.Value = idOrdenCompra
            End If

            vCompras.Where.IdCompra.Value = 0
            vCompras.Where.IdCompra.Operator = WhereParameter.Operand.IsNull

            If vCompras.Query.Load Then
                If vCompras.DefaultView.Table.Rows.Count > 0 Then
                    Return vCompras.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function Insert_Compras_Detalle(ByVal conn As String, ByVal idCompra As Integer, _
                                           ByVal idMercaderia As Integer, ByVal cantidad As Decimal, _
                                            ByVal precio As Decimal, ByVal idImpuesto As Integer, _
                                            ByVal precioFinal As Decimal, ByVal idUsuario As Integer, _
                                            ByVal poseeRemision As Boolean, ByVal lote As String, _
                                            ByVal vto As String, ByVal idDeposito As Integer, _
                                            ByVal idNotaRemision As Integer, ByVal descripcion As String, _
                                            ByVal idCaja As Integer, ByVal esCajero As Boolean) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            If idNotaRemision > 0 And idMercaderia > 0 Then

                Dim notaDet As New si_notaRemision_detalle(conn)
                notaDet.Where.IdNotaRemision.Value = idNotaRemision
                notaDet.Where.IdMercaderia.Value = idMercaderia
                If Not notaDet.Query.Load Then
                    Throw New Exception("No puede ingresar productos que no posee en la remision asignada.")
                Else
                    If notaDet.Cantidad <> cantidad Then
                        Throw New Exception("No puede ingresar productos con cantidades diferentes a la remision asignada.")
                    End If
                End If

            End If


            Dim impuestoMonto As Decimal = 0

            Dim impuesto As New ClassSigeco.ClassSigeco.si_impuesto(conn)
            impuesto.Where.IdImpuesto.Value = idImpuesto

            If impuesto.Query.Load Then

                If impuesto.Valor = 10 Then
                    impuestoMonto = precioFinal / 11
                ElseIf impuesto.Valor = 5 Then
                    impuestoMonto = precioFinal / 21
                ElseIf impuesto.Valor = 0 Then
                    impuestoMonto = 0
                End If

            End If

            Dim detalle As New ClassSigeco.ClassSigeco.si_compra_detalle(conn)

            Dim idMercaderiaLote As Integer = 0

            If poseeRemision And idMercaderia > 0 Then

                Dim loteMercaderia As New ClassSigeco.ClassSigeco.si_mercaderiaLote(conn)
                loteMercaderia.AddNew()
                loteMercaderia.IdMercaderia = idMercaderia
                loteMercaderia.Lote = lote
                If vto <> "" Then
                    loteMercaderia.Vencimiento = vto
                End If
                loteMercaderia.IdDeposito = idDeposito
                loteMercaderia.Cantidad = cantidad
                loteMercaderia.Saldo = cantidad
                loteMercaderia.CostoUnitario = precio
                loteMercaderia.Save()

                idMercaderiaLote = loteMercaderia.IdMercaderiaLote

            End If

            detalle.AddNew()
            detalle.IdCompra = idCompra
            If idMercaderia > 0 Then
                detalle.IdMercaderia = idMercaderia
            Else
                detalle.SetColumnNull("IdMercaderia")
            End If
            detalle.DescripcionGasto = descripcion
            detalle.Cantidad = cantidad
            detalle.Precio = precio
            detalle.IdImpuesto = idImpuesto
            detalle.PrecioFinal = precioFinal
            detalle.MontoImpuesto = impuestoMonto
            detalle.IdMercaderiaLote = idMercaderiaLote
            detalle.Save()

            Dim venta As New ClassSigeco.ClassSigeco.si_compra(conn)
            venta.Where.IdCompra.Value = idCompra
            If venta.Query.Load Then

                venta.TotalFactura += detalle.PrecioFinal
                venta.TotalFacturaIVA += detalle.MontoImpuesto

                If venta.Condicion = "CREDITO" Then
                    venta.TotalFacturaSaldo += detalle.PrecioFinal
                End If

                venta.ActualizadoPor = idUsuario
                venta.ActualizadoFecha = DateTime.Now
                venta.Save()

            End If

            If idCaja > 0 Then
                Dim cajas As New ClassSigeco.ClassSigeco.si_caja(conn)
                cajas.Where.IdMovimientoCaja.Value = idCaja
                If cajas.Query.Load Then

                    If (cajas.MontoCierre - precioFinal) < 0 Then
                        Throw New Exception("No posee saldo suficiente en caja para registrar egreso.")
                    End If

                    cajas.MontoCierre -= precioFinal
                    cajas.SaldoEfectivo -= precioFinal
                    cajas.Save()

                End If

            ElseIf esCajero Then
                Throw New Exception("No posee caja abierta, favor verifique.")
            End If

            tx.CommitTransaction()

            Return True

        Catch ex As Exception

            tx.RollbackTransaction()

            If ex.Message.Contains("ix_mercaderia") Then
                MessageError = New Exception("No puede ingresar la misma mercaderia en una misma compra, favor verifique.")
            Else
                MessageError = ex
            End If

            Return False

        End Try

    End Function

    Public Function Insert_Orden_Compras_Detalle(ByVal conn As String, ByVal idOrdenCompra As Integer, _
                                            ByVal idMercaderia As Integer, ByVal cantidad As Decimal, _
                                            ByVal precio As Decimal) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim detalle As New ClassSigeco.ClassSigeco.si_ordenCompra_detalle(conn)

            Dim idMercaderiaLote As Integer = 0

            detalle.AddNew()
            detalle.IdOrdenCompra = idOrdenCompra
            detalle.IdMercaderia = idMercaderia
            detalle.Cantidad = cantidad
            detalle.Precio = precio
            detalle.Save()

            tx.CommitTransaction()

            Return True

        Catch ex As Exception

            tx.RollbackTransaction()

            If ex.Message.Contains("ix_mercaderia") Then
                MessageError = New Exception("No puede ingresar la misma mercaderia en una misma compra, favor verifique.")
            Else
                MessageError = ex
            End If

            Return False

        End Try

    End Function

    Public Function Delete_Compras_Detalle(ByVal conn As String, ByVal idCompraDetalle As Integer, _
                                           ByVal codUsuario As Integer, ByVal idCompra As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim detalle As New ClassSigeco.ClassSigeco.si_compra_detalle(conn)

            detalle.Where.IdCompraDetalle.Value = idCompraDetalle

            If detalle.Query.Load Then

                If Not detalle.IsColumnNull("IdMercaderiaLote") Then
                    If detalle.IdMercaderiaLote > 0 Then

                        Dim lote As New ClassSigeco.ClassSigeco.si_mercaderiaLote(conn)
                        lote.Where.IdMercaderiaLote.Value = detalle.IdMercaderiaLote
                        If lote.Query.Load Then
                            If lote.Cantidad = lote.Saldo Then
                                lote.MarkAsDeleted()
                                lote.Save()
                            Else
                                Throw New Exception("El lote de mercaderia ya esta en uso, favor verifique sus ventas.")
                            End If
                        End If

                    End If
                End If

                Dim venta As New ClassSigeco.ClassSigeco.si_compra(conn)
                venta.Where.IdCompra.Value = idCompra

                If venta.Query.Load Then
                    venta.TotalFactura -= detalle.PrecioFinal
                    venta.TotalFacturaIVA -= detalle.MontoImpuesto

                    If venta.Condicion = "CREDITO" Then
                        venta.TotalFacturaSaldo -= detalle.PrecioFinal
                    Else
                        venta.TotalFacturaSaldo = 0
                    End If

                    venta.ActualizadoPor = codUsuario
                    venta.ActualizadoFecha = DateTime.Now
                    venta.Save()

                End If

                detalle.MarkAsDeleted()
                detalle.Save()

            End If

            tx.CommitTransaction()

            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function Delete_Orden_Compras_Detalle(ByVal conn As String, ByVal idOrdenCompraDetalle As Integer, _
                                           ByVal codUsuario As Integer, ByVal idOrdenCompra As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim detalle As New ClassSigeco.ClassSigeco.si_ordenCompra_detalle(conn)

            detalle.Where.IdOrdenCompraDetalle.Value = idOrdenCompraDetalle

            If detalle.Query.Load Then

                Dim venta As New ClassSigeco.ClassSigeco.si_ordenCompra(conn)
                venta.Where.IdOrdenCompra.Value = idOrdenCompra

                If venta.Query.Load Then
                    venta.ActualizadoPor = codUsuario
                    venta.ActualizadoFecha = DateTime.Now
                    venta.Save()
                End If

                detalle.MarkAsDeleted()
                detalle.Save()

            End If

            tx.CommitTransaction()

            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function get_Compras_Detalles_All(ByVal conn As String, ByVal idCompra As Integer) As DataTable
        Try

            Dim vDetalle As New ClassSigeco.ClassSigeco.vw_compras_detalle(conn)

            If idCompra > 0 Then
                vDetalle.Where.IdCompra.Value = idCompra
            End If

            If vDetalle.Query.Load Then
                If vDetalle.DefaultView.Table.Rows.Count > 0 Then
                    Return vDetalle.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_Caja_Detalles_All(ByVal conn As String, ByVal idMovimiento As Integer, _
                                          ByVal fecha As DateTime, ByVal idUsuario As Integer) As DataTable
        Try

            Dim vDetalle As New ClassSigeco.ClassSigeco.vw_caja_detalle(conn)

            If idMovimiento > 0 Then
                vDetalle.Where.IdCaja.Value = idMovimiento
            Else
                vDetalle.Where.ActualizadoPorid.Value = idUsuario
                vDetalle.Where.Fecha.BetweenBeginValue = New DateTime(fecha.Year, fecha.Month, fecha.Day, 0, 0, 0)
                vDetalle.Where.Fecha.BetweenEndValue = New DateTime(fecha.Year, fecha.Month, fecha.Day, 23, 59, 59)
                vDetalle.Where.Fecha.Operator = WhereParameter.Operand.Between
            End If

            vDetalle.Query.AddOrderBy("actualizadoFecha", WhereParameter.Dir.DESC)

            If vDetalle.Query.Load Then

                If vDetalle.DefaultView.Table.Rows.Count > 0 Then
                    Return vDetalle.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_Orden_Compras_Detalles_All(ByVal conn As String, ByVal idOrdenCompra As Integer) As DataTable
        Try

            Dim vDetalle As New ClassSigeco.ClassSigeco.vw_ordenCompra_detalle(conn)

            If idOrdenCompra > 0 Then
                vDetalle.Where.IdOrdenCompra.Value = idOrdenCompra
            End If

            If vDetalle.Query.Load Then
                If vDetalle.DefaultView.Table.Rows.Count > 0 Then
                    Return vDetalle.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_Compras_Detalles_ByID(ByVal conn As String, ByVal idCompraDetalle As Integer) As DataTable
        Try

            Dim vDetalle As New ClassSigeco.ClassSigeco.vw_compras_detalle(conn)

            vDetalle.Where.IdCompraDetalle.Value = idCompraDetalle

            If vDetalle.Query.Load Then
                If vDetalle.DefaultView.Table.Rows.Count > 0 Then
                    Return vDetalle.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_OrdenCompras_Detalles_ByID(ByVal conn As String, ByVal idOrdenCompraDetalle As Integer) As DataTable
        Try

            Dim vDetalle As New ClassSigeco.ClassSigeco.vw_ordenCompra_detalle(conn)

            vDetalle.Where.IdOrdenCompraDetalle.Value = idOrdenCompraDetalle

            If vDetalle.Query.Load Then
                If vDetalle.DefaultView.Table.Rows.Count > 0 Then
                    Return vDetalle.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

#End Region

#Region "Lotes"

    Public Function Insert_Mercaderia_Lote(ByVal conn As String, ByVal lote As String, ByVal vencimiento As String, ByVal cantidad As Integer, _
                                           ByVal costoUnitario As Decimal, ByVal idDeposito As Integer, ByVal idMercaderia As Integer) As Integer

        Dim tx As TransactionMgr

        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim ventas As New ClassSigeco.ClassSigeco.si_mercaderiaLote(conn)
            ventas.AddNew()

            ventas.IdDeposito = idDeposito
            ventas.IdMercaderia = idMercaderia
            ventas.Lote = lote

            If vencimiento <> "" Then
                ventas.Vencimiento = DateTime.Parse(vencimiento)
            End If

            ventas.CostoUnitario = costoUnitario

            ventas.Save()

            tx.CommitTransaction()

            Return ventas.IdMercaderiaLote

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return 0
        End Try

    End Function

    Public Function Update_Mercaderia_Lote(ByVal conn As String, ByVal idMercaderiaLote As Integer, _
                                           ByVal lote As String, _
                                           ByVal vencimiento As String, _
                                           ByVal cantidad As Integer, _
                                           ByVal costoUnitario As Decimal, ByVal idDeposito As Integer, _
                                           ByVal idUsuario As Integer, _
                                           ByVal fechaBaja As String, ByVal saldo As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim ventas As New ClassSigeco.ClassSigeco.si_mercaderiaLote(conn)
            ventas.Where.IdMercaderiaLote.Value = idMercaderiaLote

            If ventas.Query.Load Then

                ventas.IdDeposito = idDeposito
                ventas.Lote = lote

                If vencimiento <> "" Then
                    ventas.Vencimiento = DateTime.Parse(vencimiento)
                End If

                If fechaBaja <> "" Then
                    ventas.FechaBaja = DateTime.Parse(fechaBaja)
                End If

                ventas.Saldo = saldo
                ventas.CostoUnitario = costoUnitario

                If idUsuario > 0 Then
                    ventas.IdUsuarioBaja = idUsuario
                End If

                ventas.Save()

            End If

            tx.CommitTransaction()
            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function Delete_Mercaderia_Lote(ByVal conn As String, ByVal idMercaderiaLote As Integer, _
                                           ByVal codUsuario As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim compras As New ClassSigeco.ClassSigeco.si_mercaderiaLote(conn)
            compras.Where.IdMercaderiaLote.Value = idMercaderiaLote

            If compras.Query.Load Then

                'Dim detalle As New ClassSigeco.ClassSigeco.si_compra_detalle(conn)
                'detalle.Where.IdCompra.Value = idCompra
                'If detalle.Query.Load Then

                '    For i As Integer = 0 To detalle.DefaultView.Table.Rows.Count - 1

                '        'Dim producto As New Class_RC_Data.Class_RC.MATERIALES(conn)
                '        'producto.Where.CodMaterial.Value = detalle.DefaultView.Table.Rows(i)("CodMaterial")
                '        'If producto.Query.Load Then
                '        '    producto.CantExistente += detalle.DefaultView.Table.Rows(i)("cantidad")
                '        '    producto.CodUsuario = codUsuario
                '        '    producto.FechaActualizacion = DateTime.Now
                '        '    producto.Save()
                '        'End If

                '    Next

                'End If

                compras.MarkAsDeleted()
                compras.Save()

            End If

            tx.CommitTransaction()
            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function get_Mercaderia_Lote_All(ByVal conn As String, ByVal idMercaderia As Integer, ByVal mercaderia As String, ByVal conSaldo As Boolean) As DataTable
        Try

            Dim vCompras As New ClassSigeco.ClassSigeco.vw_mercaderias_lotes(conn)

            If idMercaderia > 0 Then
                vCompras.Where.IdMercaderia.Value = idMercaderia
            End If

            If mercaderia <> "" Then
                vCompras.Where.Mercaderia.Value = "%" & mercaderia & "%"
                vCompras.Where.Mercaderia.Operator = WhereParameter.Operand.Like
            Else
                'vCompras.Where.Fecha.BetweenBeginValue = New DateTime(fechaInicio.Year, fechaInicio.Month, fechaInicio.Day, 0, 0, 0)
                'vCompras.Where.Fecha.BetweenEndValue = New DateTime(fechaFin.Year, fechaFin.Month, fechaFin.Day, 23, 59, 59)
                'vCompras.Where.Fecha.Operator = WhereParameter.Operand.Between
            End If

            If conSaldo Then
                vCompras.Where.Saldo.Value = 0
                vCompras.Where.Saldo.Operator = WhereParameter.Operand.GreaterThan
            End If

            vCompras.Query.AddOrderBy("mercaderia", WhereParameter.Dir.DESC)

            If vCompras.Query.Load Then
                If vCompras.DefaultView.Table.Rows.Count > 0 Then
                    Return vCompras.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_Mercaderia_ByID(ByVal conn As String, ByVal idMercaderia As Integer) As DataTable
        Try

            Dim vCompras As New ClassSigeco.ClassSigeco.vw_mercaderias_lotes(conn)

            If idMercaderia > 0 Then
                vCompras.Where.IdMercaderia.Value = idMercaderia
            End If

            If vCompras.Query.Load Then
                If vCompras.DefaultView.Table.Rows.Count > 0 Then
                    Return vCompras.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

#End Region

#Region "RemisionCompra"

    Public Function get_Remisiones_Documento(ByVal conn As String, _
                                         ByVal documento As String, ByVal codUsuario As Integer) As String
        Dim vVentas As New ClassSigeco.ClassSigeco.si_documentos(conn)
        Dim numeroFactura As String = ""

        vVentas.Where.Documento.Value = documento
        vVentas.Where.Habilitado.Value = True
        'vVentas.Where.FechaVto.Value = DateTime.Now
        'vVentas.Where.FechaVto.Operator = WhereParameter.Operand.LessThanOrEqual

        If vVentas.Query.Load Then

            If vVentas.DefaultView.Table.Rows.Count > 0 Then

                numeroFactura = vVentas.DefaultView.Table.Rows(0)("prefijo") & _
                vVentas.DefaultView.Table.Rows(0)("numeroActual").ToString().PadLeft(7, "0")

                vVentas.NumeroActual = vVentas.NumeroActual + 1
                vVentas.ActualizadoPor = codUsuario
                vVentas.ActualizadoFecha = DateTime.Now
                vVentas.Save()

                Return numeroFactura

            Else
                Return ""
            End If

        Else

            Return ""

        End If

    End Function

    Public Function Insert_Remision_Recepcion_Transaldo(ByVal conn As String, ByVal idNotaRemision As Integer, ByVal fecha As DateTime, ByVal idMotivoRecepcion As Integer, ByVal actualizadoPor As Integer) As Boolean

        Dim tx As TransactionMgr

        tx = TransactionMgr.ThreadTransactionMgr()

        Try

            tx.BeginTransaction()

            Dim ventas As New ClassSigeco.ClassSigeco.si_notaRemision(conn)
            Dim trans As New ClassSigeco.ClassSigeco.si_notaRemision(conn)
            trans.Where.IdNotaRemision.Value = idNotaRemision

            If trans.Query.Load Then

                ventas.AddNew()
                ventas.NroComprobante = trans.NroComprobante
                ventas.Fecha = fecha
                ventas.IdDepositoOrigen = trans.IdDepositoOrigen
                ventas.IdDepositoDestino = trans.IdDepositoDestino
                ventas.IdMotivoStock = idMotivoRecepcion
                ventas.Estado = trans.Estado
                ventas.IdProveedor = trans.IdProveedor
                ventas.ActualizadoPor = actualizadoPor
                ventas.ActualizadoFecha = DateTime.Now
                ventas.Save()

                Dim mlote As New ClassSigeco.ClassSigeco.si_mercaderiaLote(conn)
                Dim notDet As New ClassSigeco.ClassSigeco.si_notaRemision_detalle(conn)
                Dim transDet As New ClassSigeco.ClassSigeco.si_notaRemision_detalle(conn)
                transDet.Where.IdNotaRemision.Value = idNotaRemision
                If transDet.Query.Load Then

                    For i As Integer = 0 To transDet.DefaultView.Table.Rows.Count - 1

                        notDet.AddNew()
                        notDet.IdNotaRemision = ventas.IdNotaRemision
                        notDet.IdMercaderia = transDet.DefaultView.Table.Rows(i)("IdMercaderia")
                        notDet.IdMercaderiaLote = transDet.DefaultView.Table.Rows(i)("IdMercaderiaLote")
                        notDet.Cantidad = transDet.DefaultView.Table.Rows(i)("Cantidad")
                        notDet.Save()

                        mlote.Query.FlushWhereParameters()
                        mlote.Query.FlushAggregateParameters()
                        mlote.FlushData()

                        mlote.AddNew()
                        mlote.IdMercaderia = transDet.DefaultView.Table.Rows(i)("IdMercaderia")
                        mlote.IdDeposito = ventas.IdDepositoDestino
                        mlote.Cantidad = transDet.DefaultView.Table.Rows(i)("Cantidad")
                        mlote.Saldo = transDet.DefaultView.Table.Rows(i)("Cantidad")
                        mlote.Save()

                    Next

                End If

            End If

            tx.CommitTransaction()
            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    'hola
    Public Function Insert_Remision(ByVal conn As String, ByVal nroComprobante As String, ByVal fecha As DateTime, _
                                    ByVal idVenta As Integer, ByVal idCompra As Integer, ByVal idMotivo As Integer, _
                                    ByVal estado As String, ByVal actualizadoPor As Integer, _
                                    ByVal codCliente As Integer, ByVal codProveedor As Integer, _
                                    ByVal idOrigen As Integer, ByVal idDestino As Integer) As Integer

        Dim tx As TransactionMgr

        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim ventas As New ClassSigeco.ClassSigeco.si_notaRemision(conn)
            ventas.AddNew()
            ventas.NroComprobante = nroComprobante
            ventas.Fecha = fecha

            If idVenta > 0 Then
                ventas.IdVenta = idVenta
            End If

            If idCompra > 0 Then
                ventas.IdCompra = idCompra
            End If

            ventas.IdDepositoOrigen = idOrigen
            ventas.IdDepositoDestino = idDestino

            ventas.IdMotivoStock = idMotivo
            ventas.Estado = estado

            If codCliente > 0 Then
                ventas.IdCliente = codCliente
            End If

            If codProveedor > 0 Then
                ventas.IdProveedor = codProveedor
            End If

            ventas.ActualizadoPor = actualizadoPor
            ventas.ActualizadoFecha = DateTime.Now
            ventas.Save()

            tx.CommitTransaction()

            Return ventas.IdNotaRemision

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return 0
        End Try

    End Function

    Public Function Insert_Remision_NonTransacc(ByVal conn As String, ByVal nroComprobante As String, ByVal fecha As DateTime, _
                                    ByVal idVenta As Integer, ByVal idCompra As Integer, ByVal idMotivo As Integer, _
                                    ByVal estado As String, ByVal actualizadoPor As Integer, _
                                    ByVal codCliente As Integer, ByVal codProveedor As Integer) As Integer



        Try


            Dim ventas As New ClassSigeco.ClassSigeco.si_notaRemision(conn)
            ventas.AddNew()
            ventas.NroComprobante = nroComprobante
            ventas.Fecha = fecha

            If idVenta > 0 Then
                ventas.IdVenta = idVenta
            End If

            If idCompra > 0 Then
                ventas.IdCompra = idCompra
            End If

            ventas.IdMotivoStock = idMotivo
            ventas.Estado = estado

            If codCliente > 0 Then
                ventas.IdCliente = codCliente
            End If

            If codProveedor > 0 Then
                ventas.IdProveedor = codProveedor
            End If

            ventas.ActualizadoPor = actualizadoPor
            ventas.ActualizadoFecha = DateTime.Now
            ventas.Save()


            Return ventas.IdNotaRemision

        Catch ex As Exception

            MessageError = ex
            Return 0
        End Try

    End Function

    Public Function Update_Remision(ByVal conn As String, ByVal idNotaRemision As Integer, _
                                           ByVal nroComprobante As String, ByVal fecha As DateTime, _
                                           ByVal idVenta As Integer, ByVal idCompra As Integer, _
                                           ByVal idMotivo As Integer, ByVal estado As String, _
                                           ByVal actualizadoPor As Integer, ByVal codCliente As Integer, _
                                           ByVal codProveedor As Integer, ByVal idOrigen As Integer, ByVal idDestino As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim ventas As New ClassSigeco.ClassSigeco.si_notaRemision(conn)
            ventas.Where.IdNotaRemision.Value = idNotaRemision

            If ventas.Query.Load Then

                ventas.NroComprobante = nroComprobante
                ventas.Fecha = fecha

                If idVenta > 0 Then
                    ventas.IdVenta = idVenta
                End If

                If idCompra > 0 Then
                    ventas.IdCompra = idCompra
                End If

                ventas.IdMotivoStock = idMotivo
                ventas.Estado = estado
                ventas.IdDepositoOrigen = idOrigen
                ventas.IdDepositoDestino = idDestino

                If codCliente > 0 Then
                    ventas.IdCliente = codCliente
                End If

                If codProveedor > 0 Then
                    ventas.IdProveedor = codProveedor
                End If

                ventas.ActualizadoPor = actualizadoPor
                ventas.ActualizadoFecha = DateTime.Now
                ventas.Save()

            End If

            tx.CommitTransaction()
            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function Delete_Remision(ByVal conn As String, ByVal idNotaRemision As Integer, _
                                           ByVal codUsuario As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim compras As New ClassSigeco.ClassSigeco.si_notaRemision(conn)
            compras.Where.IdNotaRemision.Value = idNotaRemision

            If compras.Query.Load Then

                Dim detalle As New ClassSigeco.ClassSigeco.si_notaRemision_detalle(conn)
                detalle.Where.IdNotaRemision.Value = idNotaRemision
                If detalle.Query.Load Then

                    For i As Integer = 0 To detalle.DefaultView.Table.Rows.Count - 1

                        Dim producto As New ClassSigeco.ClassSigeco.si_mercaderiaLote(conn)
                        producto.Where.IdMercaderiaLote.Value = detalle.DefaultView.Table.Rows(i)("IdMercaderiaLote")
                        If producto.Query.Load Then

                            If producto.Cantidad = producto.Saldo Then
                                producto.MarkAsDeleted()
                                producto.Save()
                            Else
                                Throw New Exception("El lote que desea borrar, ya posee movimientos.")
                            End If

                        End If

                    Next

                End If

                compras.MarkAsDeleted()
                compras.Save()

            End If

            tx.CommitTransaction()
            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function get_Remision_All(ByVal conn As String, ByVal nroComprobante As String, ByVal fechaInicio As DateTime, ByVal fechaFin As DateTime, _
                                    ByVal nroVenta As String, ByVal nroCompra As String, ByVal idMotivo As Integer, ByVal estado As String, _
                                    ByVal codCliente As Integer, ByVal codProveedor As Integer) As DataTable
        Try

            Dim vCompras As New ClassSigeco.ClassSigeco.vw_notaRemision(conn)

            If nroComprobante <> "" Then
                vCompras.Where.NroComprobante.Value = "%" & nroComprobante & "%"
                vCompras.Where.NroComprobante.Operator = WhereParameter.Operand.Like
            Else
                vCompras.Where.Fecha.BetweenBeginValue = New DateTime(fechaInicio.Year, fechaInicio.Month, fechaInicio.Day, 0, 0, 0)
                vCompras.Where.Fecha.BetweenEndValue = New DateTime(fechaFin.Year, fechaFin.Month, fechaFin.Day, 23, 59, 59)
                vCompras.Where.Fecha.Operator = WhereParameter.Operand.Between
            End If

            If nroVenta <> "" Then
                vCompras.Where.NroVenta.Value = "%" & nroVenta & "%"
                vCompras.Where.NroVenta.Operator = WhereParameter.Operand.Like
            End If

            If nroCompra <> "" Then
                vCompras.Where.NroCompra.Value = "%" & nroCompra & "%"
                vCompras.Where.NroCompra.Operator = WhereParameter.Operand.Like
            End If

            If estado <> "" Then
                vCompras.Where.Estado.Value = "%" & estado & "%"
                vCompras.Where.Estado.Operator = WhereParameter.Operand.Like
            End If

            If idMotivo > 0 Then
                vCompras.Where.IdMotivoStock.Value = idMotivo
            End If

            If codCliente > 0 Then
                vCompras.Where.IdCliente.Value = codCliente
            End If

            If codProveedor > 0 Then
                vCompras.Where.IdProveedor.Value = codProveedor
            End If

            vCompras.Query.AddOrderBy("fecha", WhereParameter.Dir.DESC)
            vCompras.Query.AddOrderBy("idNotaRemision", WhereParameter.Dir.DESC)

            If vCompras.Query.Load Then
                If vCompras.DefaultView.Table.Rows.Count > 0 Then
                    Return vCompras.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_Remision_NotaCredito(ByVal conn As String, ByVal nroComprobante As String, ByVal fechaInicio As DateTime, ByVal fechaFin As DateTime, _
                                    ByVal nroVenta As String, ByVal nroCompra As String, ByVal idMotivo As Integer, ByVal estado As String, _
                                    ByVal codCliente As Integer, ByVal codProveedor As Integer, _
                                    ByVal idCompra As Integer, ByVal conSaldo As Boolean) As DataTable
        Try

            Dim vCompras As New ClassSigeco.ClassSigeco.vw_notaRemision_NotaCredito(conn)

            If nroComprobante <> "" Then
                vCompras.Where.NroComprobante.Value = "%" & nroComprobante & "%"
                vCompras.Where.NroComprobante.Operator = WhereParameter.Operand.Like
            Else
                vCompras.Where.Fecha.BetweenBeginValue = New DateTime(fechaInicio.Year, fechaInicio.Month, fechaInicio.Day, 0, 0, 0)
                vCompras.Where.Fecha.BetweenEndValue = New DateTime(fechaFin.Year, fechaFin.Month, fechaFin.Day, 23, 59, 59)
                vCompras.Where.Fecha.Operator = WhereParameter.Operand.Between
            End If

            If nroVenta <> "" Then
                vCompras.Where.NroVenta.Value = "%" & nroVenta & "%"
                vCompras.Where.NroVenta.Operator = WhereParameter.Operand.Like
            End If

            If nroCompra <> "" Then
                vCompras.Where.NroCompra.Value = "%" & nroCompra & "%"
                vCompras.Where.NroCompra.Operator = WhereParameter.Operand.Like
            End If

            If estado <> "" Then
                vCompras.Where.Estado.Value = "%" & estado & "%"
                vCompras.Where.Estado.Operator = WhereParameter.Operand.Like
            End If

            If idMotivo > 0 Then
                vCompras.Where.IdMotivoStock.Value = idMotivo
            End If

            'If codCliente > 0 Then
            vCompras.Where.IdCliente.Value = 0
            vCompras.Where.IdCliente.Operator = WhereParameter.Operand.IsNull
            'End If

            If codProveedor > 0 Then
                vCompras.Where.IdProveedor.Value = codProveedor
            End If

            If idCompra > 0 Then
                vCompras.Where.IdCompra.Value = idCompra
            End If

            vCompras.Query.AddOrderBy("fecha", WhereParameter.Dir.DESC)
            vCompras.Query.AddOrderBy("idNotaRemision", WhereParameter.Dir.DESC)

            If vCompras.Query.Load Then
                If vCompras.DefaultView.Table.Rows.Count > 0 Then
                    Return vCompras.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_Remision_NotaCredito_ByID(ByVal conn As String, ByVal idRemision As Integer, _
                                                  ByVal idCompra As Integer) As DataTable
        Try

            Dim vCompras As New ClassSigeco.ClassSigeco.vw_notaRemisionNotaCredito(conn)

            If idRemision > 0 Then
                vCompras.Where.IdNotaRemision.Value = idRemision
            End If

            If idCompra > 0 Then
                vCompras.Where.IdCompra.Value = idCompra
            End If

            If vCompras.Query.Load Then

                If vCompras.DefaultView.Table.Rows.Count > 0 Then
                    Return vCompras.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_Remision_ByID(ByVal conn As String, ByVal idRemision As Integer) As DataTable
        Try

            Dim vCompras As New ClassSigeco.ClassSigeco.vw_notaRemision(conn)

            If idRemision > 0 Then
                vCompras.Where.IdNotaRemision.Value = idRemision
            End If

            If vCompras.Query.Load Then

                If vCompras.DefaultView.Table.Rows.Count > 0 Then
                    Return vCompras.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_Compras_Detalles_Devolucion(ByVal conn As String, ByVal idCompra As Integer) As DataTable
        Try

            Dim vDetalle As New ClassSigeco.ClassSigeco.vw_compras_devoluciones(conn)

            If idCompra > 0 Then
                vDetalle.Where.IdCompra.Value = idCompra
            End If

            vDetalle.Where.Saldo.Value = 0
            vDetalle.Where.Saldo.Operator = WhereParameter.Operand.GreaterThan

            If vDetalle.Query.Load Then
                If vDetalle.DefaultView.Table.Rows.Count > 0 Then
                    Return vDetalle.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function Insert_NotasRemision_Detalle(ByVal conn As String, ByVal idNotaRemision As Integer, _
                                                 ByVal idMercaderias As Integer, ByVal cantidad As Integer, _
                                                 ByVal lote As String, ByVal vto As String, _
                                                 ByVal idDeposito As Integer, ByVal idMotivo As Integer, _
                                                 ByVal idMercaderiaLote As Integer, ByVal idCompra As Integer, _
                                                 ByVal idVenta As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim operacion As String = ""
            Dim mercaderiaLote As New si_mercaderiaLote(conn)

            Dim motivo As New si_motivoStock(conn)
            motivo.Where.IdMotivoStock.Value = idMotivo
            If (motivo.Query.Load) Then

                If motivo.Devolucion And idCompra > 0 Then

                    Dim compra_detalle As New vw_compras_detalle_all(conn)
                    compra_detalle.Where.IdCompra.Value = idCompra
                    compra_detalle.Where.IdMercaderia.Value = idMercaderias

                    If compra_detalle.Query.Load Then

                        If cantidad > compra_detalle.Cantidad Then
                            Throw New Exception("La cantidad a devolver supera la registrada en la factura.")
                        End If

                        Dim compra_comprada As Integer = 0

                        Dim compra_cantidad As New vw_compras_detalle_cantidad(conn)
                        compra_cantidad.Where.IdCompra.Value = idCompra
                        compra_cantidad.Where.IdMercaderia.Value = idMercaderias

                        If compra_cantidad.Query.Load Then
                            compra_comprada = compra_cantidad.Cantidad
                        End If

                        Dim devolucion_cantidad As Integer = 0

                        Dim devo_cantidad As New vw_nota_remision_detalle_cantidad(conn)
                        devo_cantidad.Where.IdMercaderia.Value = idMercaderias
                        devo_cantidad.Where.IdMotivoStock.Value = idMotivo
                        devo_cantidad.Where.Devolucion.Value = True
                        devo_cantidad.Where.TipoMotivoStock.Value = motivo.TipoMotivoStock
                        devo_cantidad.Where.IdCompra.Value = idCompra

                        If devo_cantidad.Query.Load Then
                            devolucion_cantidad = devo_cantidad.Cantidad
                        End If

                        If (compra_comprada - devolucion_cantidad) - cantidad < 0 Then
                            Throw New Exception("No puede devolver una cantidad mayor a la comprada o a la devuelta.")
                        End If

                    Else
                        Throw New Exception("Mercaderia no registrada para devolucion.")
                    End If

                ElseIf motivo.Devolucion And idVenta > 0 Then

                    Dim venta_detalle As New vw_ventas_detalle_all(conn)
                    venta_detalle.Where.IdVenta.Value = idVenta
                    venta_detalle.Where.IdMercaderia.Value = idMercaderias

                    If venta_detalle.Query.Load Then

                        If cantidad > venta_detalle.Cantidad Then
                            Throw New Exception("La cantidad a devolver supera la registrada en la factura.")
                        End If

                        Dim venta_vendida As Integer = 0

                        Dim venta_cantidad As New vw_ventas_detalle_cantidad(conn)
                        venta_cantidad.Where.IdVenta.Value = idVenta
                        venta_cantidad.Where.IdMercaderia.Value = idMercaderias

                        If venta_cantidad.Query.Load Then
                            venta_vendida = venta_cantidad.Cantidad
                        End If

                        Dim devolucion_cantidad As Integer = 0

                        Dim devo_cantidad As New vw_nota_remision_detalle_cantidad(conn)
                        devo_cantidad.Where.IdMercaderia.Value = idMercaderias
                        devo_cantidad.Where.IdMotivoStock.Value = idMotivo
                        devo_cantidad.Where.Devolucion.Value = True
                        devo_cantidad.Where.TipoMotivoStock.Value = motivo.TipoMotivoStock
                        devo_cantidad.Where.IdVenta.Value = idVenta

                        If devo_cantidad.Query.Load Then
                            devolucion_cantidad = devo_cantidad.Cantidad
                        End If

                        If (venta_vendida - devolucion_cantidad) - cantidad < 0 Then
                            Throw New Exception("No puede devolver una cantidad mayor a la vendida o a la devuelta.")
                        End If

                    Else

                        Throw New Exception("Mercaderia no registrada para devolucion.")

                    End If

                End If

                'puede ser compra nuevo lote o devolucion de cliente nuevo lote
                If motivo.TipoMotivoStock = "S" Then

                    mercaderiaLote.AddNew()
                    mercaderiaLote.IdMercaderia = idMercaderias
                    mercaderiaLote.Lote = lote
                    If vto <> "" Then
                        mercaderiaLote.Vencimiento = DateTime.Parse(vto)
                    End If
                    mercaderiaLote.IdDeposito = idDeposito
                    mercaderiaLote.Cantidad = cantidad
                    mercaderiaLote.Saldo = cantidad
                    mercaderiaLote.Save()

                ElseIf motivo.TipoMotivoStock = "R" Then

                    mercaderiaLote.Where.IdMercaderiaLote.Value = idMercaderiaLote
                    If mercaderiaLote.Query.Load Then
                        If (mercaderiaLote.Saldo - cantidad) < 0 Then
                            Throw New Exception("No posee la cantidad suficiente en el lote seleccionado")
                        End If
                        mercaderiaLote.Saldo -= cantidad
                        mercaderiaLote.Save()
                    End If

                End If

            End If

            If mercaderiaLote.IdMercaderiaLote > 0 Then
                Dim detalle As New ClassSigeco.ClassSigeco.si_notaRemision_detalle(conn)
                detalle.AddNew()
                detalle.IdNotaRemision = idNotaRemision
                detalle.IdMercaderia = idMercaderias
                detalle.Cantidad = cantidad
                detalle.IdMercaderiaLote = mercaderiaLote.IdMercaderiaLote
                detalle.Save()
            End If

            tx.CommitTransaction()

            Return True

        Catch ex As Exception

            tx.RollbackTransaction()

            If ex.Message.Contains("ix_mercaderia") Then
                MessageError = New Exception("No puede ingresar la misma mercaderia en una misma compra, favor verifique.")
            Else
                MessageError = ex
            End If

            Return False

        End Try

    End Function

    Public Function Insert_NotasRemision_Detalle_NonTransacc(ByVal conn As String, ByVal idNotaRemision As Integer, _
                                                 ByVal idMercaderias As Integer, ByVal cantidad As Integer, _
                                                 ByVal lote As String, ByVal vto As String, _
                                                 ByVal idDeposito As Integer, ByVal idMotivo As Integer, _
                                                 ByVal idMercaderiaLote As Integer) As Boolean


        Try


            Dim operacion As String = ""
            Dim mercaderiaLote As New si_mercaderiaLote(conn)

            Dim motivo As New si_motivoStock(conn)
            motivo.Where.IdMotivoStock.Value = idMotivo
            If (motivo.Query.Load) Then

                'puede ser compra nuevo lote o devolucion de cliente nuevo lote
                If motivo.TipoMotivoStock = "S" Then

                    mercaderiaLote.AddNew()
                    mercaderiaLote.IdMercaderia = idMercaderias
                    mercaderiaLote.Lote = lote
                    If vto <> "" Then
                        mercaderiaLote.Vencimiento = DateTime.Parse(vto)
                    End If
                    mercaderiaLote.IdDeposito = idDeposito
                    mercaderiaLote.Cantidad = cantidad
                    mercaderiaLote.Saldo = cantidad
                    mercaderiaLote.Save()

                    'ElseIf motivo.TipoMotivoStock = "R" And idMotivo <> idMotivoVenta Then

                    '    mercaderiaLote.Where.IdMercaderiaLote.Value = idMercaderiaLote
                    '    If mercaderiaLote.Query.Load Then
                    '        If (mercaderiaLote.Saldo - cantidad) < 0 Then
                    '            Throw New Exception("No posee la cantidad suficiente en el lote seleccionado")
                    '        End If
                    '        mercaderiaLote.Saldo -= cantidad
                    '        mercaderiaLote.Save()
                    '    End If

                End If

            End If

            If idMercaderiaLote > 0 Then
                Dim detalle As New ClassSigeco.ClassSigeco.si_notaRemision_detalle(conn)
                detalle.AddNew()
                detalle.IdNotaRemision = idNotaRemision
                detalle.IdMercaderia = idMercaderias
                detalle.Cantidad = cantidad
                detalle.IdMercaderiaLote = idMercaderiaLote
                detalle.Save()
            End If

            Return True

        Catch ex As Exception


            If ex.Message.Contains("ix_mercaderia") Then
                MessageError = New Exception("No puede ingresar la misma mercaderia en una misma compra, favor verifique.")
            Else
                MessageError = ex
            End If

            Return False

        End Try

    End Function

    Public Function Delete_NotasRemision_Detalle(ByVal conn As String, ByVal idNotaRemisionDetalle As Integer, _
                                           ByVal codUsuario As Integer, ByVal idNotaRemision As Integer, _
                                           ByVal codMotivo As Integer) As Boolean

        Dim tx As TransactionMgr
        tx = TransactionMgr.ThreadTransactionMgr()

        Try
            tx.BeginTransaction()

            Dim motivo As New si_motivoStock(conn)
            motivo.Where.IdMotivoStock.Value = codMotivo
            If motivo.Query.Load Then

                Dim detalle As New ClassSigeco.ClassSigeco.si_notaRemision_detalle(conn)
                detalle.Where.IdNotaRemisionDetalle.Value = idNotaRemisionDetalle
                If detalle.Query.Load Then

                    Dim venta As New ClassSigeco.ClassSigeco.si_mercaderiaLote(conn)
                    venta.Where.IdMercaderiaLote.Value = detalle.IdMercaderiaLote
                    If venta.Query.Load Then

                        If Not (motivo.Motivo.Contains("TRANSLADO DE MERCADERIA") Or motivo.Motivo.Contains("RECEPCION DE MERCADERIA")) And (Not motivo.Devolucion Or motivo.TipoMotivoStock = "S") Then

                            If venta.Cantidad = venta.Saldo Then
                                venta.MarkAsDeleted()
                                venta.Save()
                            Else
                                Throw New Exception("El lote que desea borrar, ya posee movimientos.")
                            End If

                        Else

                            If motivo.TipoMotivoStock = "R" Then
                                venta.Saldo += detalle.Cantidad
                                venta.Save()
                            ElseIf motivo.TipoMotivoStock = "S" Then
                                venta.Saldo -= detalle.Cantidad
                                venta.Save()
                            End If

                        End If

                    End If

                    detalle.MarkAsDeleted()
                    detalle.Save()

                End If

            End If

            tx.CommitTransaction()

            Return True

        Catch ex As Exception
            tx.RollbackTransaction()
            MessageError = ex
            Return False
        End Try

    End Function

    Public Function get_NotasRemision_Detalles_All(ByVal conn As String, ByVal idNotaRemision As Integer) As DataTable
        Try

            Dim vDetalle As New ClassSigeco.ClassSigeco.vw_notaRemision_detalle(conn)

            If idNotaRemision > 0 Then
                vDetalle.Where.IdNotaRemision.Value = idNotaRemision
            End If

            If vDetalle.Query.Load Then
                If vDetalle.DefaultView.Table.Rows.Count > 0 Then
                    Return vDetalle.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function

    Public Function get_NotasRemision_Detalles_ByID(ByVal conn As String, ByVal idNotaRemisionDetalle As Integer) As DataTable
        Try

            Dim vDetalle As New ClassSigeco.ClassSigeco.vw_notaRemision_detalle(conn)

            vDetalle.Where.IdNotaRemisionDetalle.Value = idNotaRemisionDetalle

            If vDetalle.Query.Load Then
                If vDetalle.DefaultView.Table.Rows.Count > 0 Then
                    Return vDetalle.DefaultView.Table
                Else
                    Return Nothing
                End If

            Else
                Return Nothing

            End If

        Catch ex As Exception
            MessageError = ex
            Return Nothing
        End Try

    End Function


#End Region

End Class
